home *** CD-ROM | disk | FTP | other *** search
- Subject: v07i064: Image manipulation routines in C++, Part01/05
- Newsgroups: mod.sources
- Approved: mirror!rs
-
- Submitted by: David Sher <seismo!rochester!sher>
- Mod.sources: Volume 7, Issue 64
- Archive-name: image/Part01
-
-
- [ The Makefiles had ESCAPE and \r characters in their comment lines;
- I changed them to their printable representation, the two-character
- sequences ^[ and ^M, respectively. Also, the file ascii2var/uu.test.var
- had some non-ASCII characters in it; I used uuencode; the resultant
- file is really ascii2var/test.var. Also, I do not have C++ nor any
- images, so I have not tested this package. --r$ ]
-
- #!/bin/sh
- # This is a shell archive. Remove anything before this line,
- # then unpack it by saving it in a file and typing "sh file".
- # If all goes well, you will see the message "No problems found."
- # Wrapped by mirror!rs on Mon Nov 10 13:38:43 EST 1986
-
- # Exit status; set to 1 on "wc" errors or if would overwrite.
- STATUS=0
- # Contents: ascii2var correlate lowerbound man scale truncate
- # upperbound var2ascii varc++ vartools README copywrite
- # ascii2var/main.c++ ascii2var/makefile ascii2var/uu.test.var
- # correlate/main.c++ correlate/makefile lowerbound/main.c++
- # lowerbound/makefile man/image.5 man/iff2var.1 man/var2iff.1
- # man/ascii2var.1
-
- for I in ascii2var correlate lowerbound man scale truncate upperbound \
- var2ascii varc++ vartools ; do
- if test -d $I ; then
- echo Directory $I exists, changing mode just in case
- else
- echo mkdir - $I
- mkdir $I
- fi
- chmod 777 $I
- done
- echo x - README
- if test -f README ; then
- echo README exists, putting output in $$README
- OUT=$$README
- STATUS=1
- else
- OUT=README
- fi
- sed 's/^X//' > $OUT <<'@//E*O*F README//'
- XThis directory contains a set of files that constitute a package of routines
- Xfor manipulating images in C++. These routines are designed to be
- Xfile format independent. The interface to your local image file
- Xformat will have to be written on site. At this time there are
- Xinterfaces written for the Maryland U image file format (mv) and the U
- XBritish Columbia image file form (iff) which can be supplied at
- Xrequest to the author. The routines supplied are interfaced to the
- Xlocally produced vision archive format (var) which is an extension of
- Xiff to handle a more varied type of image. The makefiles in this
- Xpackage assume a program called c++ which takes a file with c++
- Xsource and terminates in .c++ and returns a file that ends in .o.
- XNote that some modification of the makefiles are probably necessary
- Xfor your system. This software isn't and isn't meant to be self installing.
- XI tolerate this because it will probably have to be modified in any
- Xcase to run with the local image file format.
- X-David Sher
- Xsher@rochester
- X{seismo,allegra}!rochester!sher
- X/*
- XCopyright (C) 1986, David Sher in the University of Rochester
- XPermission is granted to any individual or institution to use, copy, or
- Xredistribute this software so long as it is not sold for profit, provided
- Xthis copyright notice is retained.
- X*/
- @//E*O*F README//
- chmod u=rw,g=r,o=r $OUT
-
- echo x - copywrite
- if test -f copywrite ; then
- echo copywrite exists, putting output in $$copywrite
- OUT=$$copywrite
- STATUS=1
- else
- OUT=copywrite
- fi
- sed 's/^X//' > $OUT <<'@//E*O*F copywrite//'
- X/*
- XCopyright (C) 1986, David Sher in the University of Rochester
- XPermission is granted to any individual or institution to use, copy, or
- Xredistribute this software so long as it is not sold for profit, provided
- Xthis copyright notice is retained.
- X*/
- @//E*O*F copywrite//
- chmod u=rw,g=r,o=r $OUT
-
- echo x - ascii2var/main.c++
- if test -f ascii2var/main.c++ ; then
- echo ascii2var/main.c++ exists, putting output in $$ascii2var/main.c++
- OUT=$$ascii2var/main.c++
- STATUS=1
- else
- OUT=ascii2var/main.c++
- fi
- sed 's/^X//' > $OUT <<'@//E*O*F ascii2var/main.c++//'
- X/*
- X This is the main routine for translating
- X ascii to floating point images
- X*/
-
- X#include <stream.h>
- X#include <stdio.h>
- X#include <vartools.h++>
-
- Xint
- Xmain(int argc,char *argv[])
- X {
- X switch ( argc )
- X {
- X // with 0 arguments it is a pipe
- X case 1:
- X ascii2var(stdin,stdout);
- X break;
- X // with 1 arguments it takes from named file to stdout
- X case 2:
- X {
- X FILE *input; // pointer to the input file
- X if ( NULL == ( input = fopen(argv[1],"r") ) )
- X {
- X perror("ascii2var");
- X return 2;
- X }
- X ascii2var(input,stdout);
- X }
- X break;
- X // with 2 arguments it takes from named file to named file
- X case 3:
- X {
- X FILE *input; // pointer to the input file
- X FILE *output; // pointer to the output file
- X if ( NULL == ( input = fopen(argv[1],"r") ) )
- X {
- X perror("ascii2var");
- X return 2;
- X }
- X if ( NULL == ( output = fopen(argv[2],"w") ) )
- X {
- X perror("ascii2var");
- X return 2;
- X }
- X ascii2var(input,output);
- X }
- X break;
- X // otherwise something is wrong
- X default:
- X cerr << "Syntax is: ascii2var [input [output]]\n";
- X return 1;
- X }
- X return 0;
- X }
- X/*
- XCopyright (C) 1986, David Sher in the University of Rochester
- XPermission is granted to any individual or institution to use, copy, or
- Xredistribute this software so long as it is not sold for profit, provided
- Xthis copyright notice is retained.
- X*/
- @//E*O*F ascii2var/main.c++//
- chmod u=rw,g=r,o=r $OUT
-
- echo x - ascii2var/makefile
- if test -f ascii2var/makefile ; then
- echo ascii2var/makefile exists, putting output in $$ascii2var/makefile
- OUT=$$ascii2var/makefile
- STATUS=1
- else
- OUT=ascii2var/makefile
- fi
- sed 's/^X//' > $OUT <<'@//E*O*F ascii2var/makefile//'
- X# this is the makefile for iff2var
-
- X.SUFFIXES: .c++
-
- X# This line constructs the program name (equal to the directory name)
- X# jccpwd^[!!sh^M:s/.*\///g^MIPROGRAM = ^[
- XPROGRAM = ascii2var
-
- XCFLAGS = -O -I/usr/grads/include -DVAX -Ddebug
-
-
- XC++FLAGS = +i $(CFLAGS)
-
- XLIBS = -lvartools -lvarc++ -lvar -liff
-
- X# This line constructs the list of possible objects
- X# 2jc}ls *[A-Za-z0-9].c *.c++^[!!sh^M>}>}:g/\.c\+*$/ s//.o \\/^M
- XOBJS = \
- X main.o
-
-
- X.c++.o:
- X c++ -c $(C++FLAGS) $*.c++
-
- X# the program is linked by this line
- X$(PROGRAM) : $(OBJS)
- X CC -o $(PROGRAM) $(CFLAGS) $(OBJS) $(LIBS)
-
- X# the program is linted by this line
- X$(PROGRAM).lint : *.c
- X lint -hb *.c -lm > lint.out
- @//E*O*F ascii2var/makefile//
- chmod u=rw,g=r,o=r $OUT
-
- echo x - ascii2var/uu.test.var
- if test -f ascii2var/uu.test.var ; then
- echo ascii2var/uu.test.var exists, putting output in $$ascii2var/uu.test.var
- OUT=$$ascii2var/uu.test.var
- STATUS=1
- else
- OUT=ascii2var/uu.test.var
- fi
- sed 's/^X//' > $OUT <<'@//E*O*F ascii2var/uu.test.var//'
- Xbegin 644 test.tar
- XM(3QA<F-H/@I?+DA%041%4B`@("`@("`@+3$@("`@("`@("`@.3@@("`@,3`@
- XM("`@-C0T("`@("`Y.2`@("`@("`@8`I&:6QE(%1Y<&4@/2!V87AD;W5B;&4*
- XM0GET97,@<&5R(%!I>&5L(#T@.`I.=6UB97(@0F%N9',@/2`R"C`@/2!L;W=?
- XM<&EX96QS(&EF9@HS,B`](&AI9VA?<&EX96QS(&EF9@H*7RY#3TU-14Y44R`@
- XM("`@("TQ("`@("`@("`@(#DX("`@(#$P("`@(#8T-"`@("`@,34@("`@("`@
- XM(&`*5&AI<R!I<R!A('1E<W0*"FQO=U]P:7AE;',@("`@("`M,2`@("`@("`@
- XM("`Y."`@("`Q,"`@("`V-#0@("`@(#$P-#@@("`@("!@"DEM86=E9FEL92!V
- XM97)S:6]N+3(Z(&YR;W=S(#T@,B!N8V]L<R`](#,@8G!P(#T@,S(@<VEG;F5D
- XM(#T@,"!P;W-I=&EV92`](#$*````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM`````````````````````````````````/`_`%JE0%EV8<(``#'`'W[0O0``
- XM`$!H:6=H7W!I>&5L<R`@("`@+3$@("`@("`@("`@.3@@("`@,3`@("`@-C0T
- XM("`@("`Q,#0X("`@("`@8`I);6%G969I;&4@=F5R<VEO;BTR.B!N<F]W<R`]
- XM(#(@;F-O;',@/2`S(&)P<"`](#,R('-I9VYE9"`](#`@<&]S:71I=F4@/2`Q
- XM"@``````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- XM````````````````````````````````````````````````````````````
- X>``````````#P/P!:I4!9=F'"```QP!]^T+T```!`
- X`
- Xend
- @//E*O*F ascii2var/uu.test.var//
- chmod u=rw,g=rw,o=rw $OUT
-
- echo x - correlate/main.c++
- if test -f correlate/main.c++ ; then
- echo correlate/main.c++ exists, putting output in $$correlate/main.c++
- OUT=$$correlate/main.c++
- STATUS=1
- else
- OUT=correlate/main.c++
- fi
- sed 's/^X//' > $OUT <<'@//E*O*F correlate/main.c++//'
- X/*
- X This is the main routine for the correlation program
- X Syntax is:
- X correlation template.var [input.var [output.var]]
- X*/
-
- X#include <stream.h>
- X#include <stdio.h>
- X#include <double_image.h++>
- X#include <vartools.h++>
-
- Xint
- Xmain ( int argc , char *argv[] )
- X {
- X switch(argc)
- X {
- X // if only 1 argument act as a pipe
- X case 2:
- X {
- X FILE *template_file;
- X // open the template file
- X if ( NULL == (template_file = fopen(argv[1],"r")))
- X {
- X perror(form("Problem with opening %s mode r:",argv[1]));
- X return 2;
- X }
- X // do the correlation
- X correlate(template_file,stdin,stdout,"");
- X }
- X break;
- X // if two arguments use the second for input file
- X case 3:
- X {
- X FILE *template_file;
- X // open the template file
- X if ( NULL == (template_file = fopen(argv[1],"r")))
- X {
- X perror(form("Problem with opening %s mode r:",argv[1]));
- X return 2;
- X }
- X FILE *input_file;
- X // open the input file
- X if ( NULL == (input_file = fopen(argv[2],"r")))
- X {
- X perror(form("correlate: Problem with opening %s mode r:",argv[2]));
- X return 3;
- X }
- X // do the correlation
- X correlate(template_file,input_file,stdout,"");
- X }
- X break;
- X // if 3 arguments use the second for input and the 3rd for output
- X case 4:
- X {
- X FILE *template_file;
- X // open the template file
- X if ( NULL == (template_file = fopen(argv[1],"r")))
- X {
- X perror(form("correlate: Problem with opening %s mode r:",argv[1]));
- X return 2;
- X }
- X FILE *input_file;
- X // open the input file
- X if ( NULL == (input_file = fopen(argv[2],"r")))
- X {
- X perror(form("correlate: Problem with opening %s mode r:",argv[2]));
- X return 3;
- X }
- X FILE *output_file;
- X // open the output file
- X if ( NULL == (output_file = fopen(argv[3],"w")))
- X {
- X perror(form("correlate: Problem with opening %s mode w:",argv[3]));
- X return 4;
- X }
- X // do the correlation
- X correlate(template_file,input_file,output_file,"");
- X }
- X break;
- X // if wrong number of arguments print error message and exit
- X default:
- X cerr << "Syntax is: correlation template.var [input.var [output.var]]\n";
- X return 1;
- X break;
- X }
- X return 0;
- X }
- X/*
- XCopyright (C) 1986, David Sher in the University of Rochester
- XPermission is granted to any individual or institution to use, copy, or
- Xredistribute this software so long as it is not sold for profit, provided
- Xthis copyright notice is retained.
- X*/
- @//E*O*F correlate/main.c++//
- chmod u=rw,g=r,o=r $OUT
-
- echo x - correlate/makefile
- if test -f correlate/makefile ; then
- echo correlate/makefile exists, putting output in $$correlate/makefile
- OUT=$$correlate/makefile
- STATUS=1
- else
- OUT=correlate/makefile
- fi
- sed 's/^X//' > $OUT <<'@//E*O*F correlate/makefile//'
- X# this is the makefile for iff2var
-
- X.SUFFIXES: .c++
-
- X# This line constructs the program name (equal to the directory name)
- X# jccpwd^[!!sh^M:s/.*\///g^MIPROGRAM = ^[
- XPROGRAM = correlate
-
- XCFLAGS = -O -I/usr/grads/include -DVAX -Ddebug
-
-
- XC++FLAGS = +i $(CFLAGS)
-
- XLIBS = -lvartools -lvarc++ -lvar -liff
-
- X# This line constructs the list of possible objects
- X# 2jc}ls *[A-Za-z0-9].c *.c++^[!!sh^M>}>}:g/\.c\+*$/ s//.o \\/^M
- XOBJS = \
- X main.o
-
-
- X.c++.o:
- X c++ -c $(C++FLAGS) $*.c++
-
- X# the program is linked by this line
- X$(PROGRAM) : $(OBJS)
- X c++ -o $(PROGRAM) $(CFLAGS) $(OBJS) $(LIBS)
-
- X# the program is linted by this line
- X$(PROGRAM).lint : *.c
- X lint -hb *.c -lm > lint.out
- @//E*O*F correlate/makefile//
- chmod u=rw,g=r,o=r $OUT
-
- echo x - lowerbound/main.c++
- if test -f lowerbound/main.c++ ; then
- echo lowerbound/main.c++ exists, putting output in $$lowerbound/main.c++
- OUT=$$lowerbound/main.c++
- STATUS=1
- else
- OUT=lowerbound/main.c++
- fi
- sed 's/^X//' > $OUT <<'@//E*O*F lowerbound/main.c++//'
- X/*
- X This applies an lower bound to a var file
- X The syntax is:
- X lowerbound bound [input.var [output.var]]
- X*/
- X#include <stream.h>
- X#include <stdio.h>
- X#include <vartools.h++>
-
-
- Xint
- Xmain ( int argc , char *argv[] )
- X {
- X switch(argc)
- X {
- X // with 1 argument it acts as a pipe
- X case 2:
- X lower_bound(atof(argv[1]),stdin,stdout,"Bounding file from stdin\n");
- X break;
- X // with 2 arguments it reads from specified file and writes to stdout
- X case 3:
- X FILE *input;
- X if(NULL == (input = fopen(argv[2],"r")))
- X {
- X perror(form("lowerbound problem with openning %s:",argv[2]));
- X return 5;
- X }
- X lower_bound(atof(argv[1]),input,stdout,form("bounding file %s\n",argv[2]));
- X break;
- X // with 3 arguments it reads from specified file and writes to
- X // specified file
- X case 4:
- X FILE *input;
- X FILE *output;
- X if(NULL == (input = fopen(argv[2],"r")))
- X {
- X perror(form("lowerbound problem with openning %s:",argv[2]));
- X return 5;
- X }
- X if(NULL == (output = fopen(argv[3],"w")))
- X {
- X perror(form("lowerbound problem with openning %s:",argv[3]));
- X return 6;
- X }
- X lower_bound(atof(argv[1]),input,output,form("bounding file %s to file %s\n",argv[2],argv[3]));
- X break;
- X // otherwise wrong number of arguments failure!
- X default:
- X cerr << "Syntax is: lowerbound bound [input.var [output.var]]";
- X return 1;
- X break;
- X }
- X return 0;
- X }
- X/*
- XCopyright (C) 1986, David Sher in the University of Rochester
- XPermission is granted to any individual or institution to use, copy, or
- Xredistribute this software so long as it is not sold for profit, provided
- Xthis copyright notice is retained.
- X*/
- @//E*O*F lowerbound/main.c++//
- chmod u=rw,g=r,o=r $OUT
-
- echo x - lowerbound/makefile
- if test -f lowerbound/makefile ; then
- echo lowerbound/makefile exists, putting output in $$lowerbound/makefile
- OUT=$$lowerbound/makefile
- STATUS=1
- else
- OUT=lowerbound/makefile
- fi
- sed 's/^X//' > $OUT <<'@//E*O*F lowerbound/makefile//'
- X# this is the makefile for iff2var
-
- X.SUFFIXES: .c++
-
- X# This line constructs the program name (equal to the directory name)
- X# jccpwd^[!!sh^M:s/.*\///g^MIPROGRAM = ^[
- XPROGRAM = lowerbound
-
- XCFLAGS = -O -I/usr/grads/include -DVAX -Ddebug
-
-
- XC++FLAGS = +i $(CFLAGS)
-
- XLIBS = -lvartools -lvarc++ -lvar -liff
-
- X# This line constructs the list of possible objects
- X# 2jc}ls *[A-Za-z0-9].c *.c++^[!!sh^M>}>}:g/\.c\+*$/ s//.o \\/^M
- XOBJS = \
- X main.o
-
-
- X.c++.o:
- X c++ -c $(C++FLAGS) $*.c++
-
- X# the program is linked by this line
- X$(PROGRAM) : $(OBJS)
- X c++ -o $(PROGRAM) $(CFLAGS) $(OBJS) $(LIBS)
-
- X# the program is linted by this line
- X$(PROGRAM).lint : *.c
- X lint -hb *.c -lm > lint.out
- @//E*O*F lowerbound/makefile//
- chmod u=rw,g=r,o=r $OUT
-
- echo x - man/image.5
- if test -f man/image.5 ; then
- echo man/image.5 exists, putting output in $$man/image.5
- OUT=$$man/image.5
- STATUS=1
- else
- OUT=man/image.5
- fi
- sed 's/^X//' > $OUT <<'@//E*O*F man/image.5//'
- X.TH IMAGE 5 8/19/86
- X.CM 1
- X.SH "NAME"
- Ximage \- double_image long_image
- X.SH "SYNOPSIS"
- X.nf
- X// for a long image
- X#include <long_image.h++>
- X// for a double image
- X#include <double_image.h++>
- X// to create your own image type
- X#include <image.h++>
- X.sp
- X// this is the base data structure for images:
- X.sp
- X.sp
- X/*
- X The operations that can be applied when creating the window.
- X one can read in an image or create one.
- X*/
- Xenum create_image_type { CREATE = 7 };
- Xenum read_image_type { READ = 4 };
- X.sp
- X.sp
- X/* protection for images */
- Xenum image_prot
- X {
- X CAN_READ = 1 ,
- X CAN_WRITE = 2 ,
- X CAN_READ_AND_WRITE = 3 ,
- X CAN_NOT_DO_ANYTHING = 4
- X };
- X.sp
- X/*
- X useful for determining the status of data structures
- X*/
- Xenum status { INITIALIZED = 8 , UNINITIALIZED = 16 };
- X.sp
- X/*
- X This is the abstract data type for any image
- X Actually objects of this type are not useful
- X it is meant to have derived types
- X*/
- Xclass image_class
- X {
- Xpublic:
- X card number_rows; // number rows in image
- X card number_cols; // number of collumns in image
- X void * header_info ; // any further header information required by implementation
- X image_prot prot; // the protection of the image
- X card comment_length; // the length of the comments
- X char * comments ; // comments about the image
- X status image_status; // determines when image data is initialized
- X.sp
- X /* position in image */
- X status window_status; // determines when the window has been initialized
- X card collumn; // the collumn
- X card row; // the row
- X card window_width; // width of possible window in image
- X card window_length; // length of possible window in image
- X FILE * file; // file associated with image
- X.sp
- X /* constructors for images */
- X /* constructor when reading an image from a file */
- X image_class
- X (
- X const read_image_type rit , // marker that the image is being read
- X const FILE * image_file , // file for image
- X const card w_width , // window width
- X const card w_length // window length
- X );
- X.sp
- X /* constructor for creating a new image */
- X image_class
- X (
- X const create_image_type cit, // maker that the image is being created
- X const FILE * image_file , // the file for the image
- X const card n_rows , // the number of rows in the image
- X const card n_cols , // the number of collumns in the image
- X const card w_width , // the width of the window
- X const card w_length // the length of the window
- X );
- X.sp
- X /* destructor for images */
- X ~image_class () { ; }
- X.sp
- X /* comment manipulation */
- X.sp
- X /* sets the comments */
- X void set_comments( char * string , const card length );
- X.sp
- X /* adds a string to the comments */
- X void add_comment( char * string , const card length );
- X.sp
- X /* for moving around in an image */
- X.sp
- X.sp
- X /*
- X move in row n steps
- X returns 1 when that motion is legal 0 otherwise
- X */
- X virtual int move_collumn ( const int n ) ;
- X.sp
- X /*
- X move in collumn n steps
- X returns 1 when that motion is legal 0 otherwise
- X */
- X virtual int move_row ( const int n ) ;
- X.sp
- X /*
- X move to specified row
- X */
- X virtual void move_to_row ( const card n ) ;
- X.sp
- X /*
- X move to specified collumn
- X */
- X virtual void move_to_collumn ( const card n ) ;
- X.sp
- X /* routine to write out the image to a file */
- X virtual void write ( ) ;
- X.sp
- X /* change the protection from CAN_WRITE to CAN_READ_AND_WRITE */
- X virtual void read_and_write ( );
- X.sp
- X };
- X.sp
- X/* returns a null terminated string for comments */
- Xconst char * comment_string ( image_class& i );
- X.sp
- X.sp
- X// This is the derived type for images of doubles.
- X// The derived type for longs is the same with long replacing double
- X.sp
- X.sp
- X/*
- X the definition of the class to manage image structures
- X*/
- Xclass double_image : image_class
- X {
- X double *image_buffer; // buffer to hold image
- X double **image_rows; // pointers to the rows of the image
- X double **window_rows; // pointers to the rows of the window
- X /* functions for function pointers */
- X ...
- X.sp
- Xpublic:
- X /* constructors */
- X /* the constructor when the image is being read from a file */
- X double_image
- X (
- X const read_image_type rit , // marker that the image is being read
- X const FILE * image_file , // file for image
- X const card w_width = 1 , // window width
- X const card w_length = 1 // window length
- X );
- X.sp
- X /* the constructor when the image is built */
- X double_image
- X (
- X const create_image_type cit , // marker that the image is being created
- X const card n_rows , // the number of rows in the image
- X const card n_cols , // the number of collumns in the image
- X const FILE * image_file , // file for image
- X const card w_width = 1 , // window width
- X const card w_length = 1 // window length
- X );
- X.sp
- X /* destructor (who would want to destroy an image?) */
- X ~double_image ( ) { ; }
- X.sp
- X /* access routines for parts of data structure */
- X const card n_rows() { return number_rows ; }
- X const card n_cols() { return number_cols ; }
- X const image_prot the_prot() { return prot; }
- X const card c_length() { return comment_length ; }
- X const char *the_comments() { return comments ; }
- X const card the_collumn() { return collumn ; }
- X const card the_row() { return row ; }
- X const card the_width() { return window_width ; }
- X const card the_length() { return window_length ; }
- X const FILE * the_file() { return file ; }
- X const status image_init() { return image_status ; }
- X const status window_init() { return window_status ; }
- X.sp
- X /* access a pointer to a particular row */
- X const double * get_row( card row );
- X.sp
- X /* sets the comments */
- X void set_comments( char * string , const card length )
- X {
- X this->image_class::set_comments ( string , length );
- X }
- X.sp
- X /* adds a string to the comments */
- X void add_comment( char * string , const card length )
- X {
- X this->image_class::add_comment ( string , length );
- X }
- X.sp
- X.sp
- X /* real versions of virtual functions */
- X /* routine to write out the image to a file */
- X void write ( ) ;
- X.sp
- X /*
- X move in row n steps
- X returns 1 when that motion is legal 0 otherwise
- X */
- X int move_collumn ( const int n ) ;
- X.sp
- X /*
- X move in collumn n steps
- X returns 1 when that motion is legal 0 otherwise
- X */
- X int move_row ( const int n ) ;
- X.sp
- X /*
- X move to specified row
- X */
- X void move_to_row ( const card n ) ;
- X.sp
- X /*
- X move to specified collumn
- X */
- X void move_to_collumn ( const card n ) ;
- X.sp
- X
- X /*
- X the function to get the specified element of a window
- X it is a function pointer so that unitialized windows
- X or protected images don't get read from
- X this accesses the function pointer
- X */
- X double get_w_e ( const card i , const card j )
- X { return (( double (*) (...) )(* get_w_e_pointer)) ( this , i , j ); }
- X.sp
- X /*
- X the fast function without checking for initialization
- X of a function pointer for getting elements of a window
- X Also no bounds checking!
- X ( Not recommended!)
- X */
- X double fast_g_w_e ( const card i , const card j )
- X { return window_rows[i][j]; }
- X
- X /*
- X the function to write to the specified element of a window.
- X it is a function pointer so that unitialized windows
- X or protected images don't get read from
- X this accesses the function pointer
- X */
- X void write_w_e ( const card i , const card j , const double value )
- X { ((void (*) (...) )(* write_w_e_pointer)) ( this , i , j , value ); }
- X.sp
- X /*
- X the fast function without checking for initialization
- X of a function pointer for writing elements to a window
- X Also no bounds checking!
- X ( Not recommended!)
- X */
- X void fast_w_w_e ( const card i , const card j , const double value )
- X { window_rows[i][j] = value; }
- X.sp
- X /*
- X the function call on the image gets the upper left hand
- X of the image window and returns a reference so it can be
- X used as a lvalue or rvalue
- X optimized so does not check that the window is initialized
- X if the window is not initialized then odd things may happen
- X */
- X double& operator() ()
- X { return **window_rows; }
- X
- X /*
- X move to next legal position in image
- X returns 1 when there is a next legal position 0 otherwise
- X if the window is not initialized then it initializes it.
- X with the window in the position 0,0 (if possible)
- X */
- X int (* next) (...); /* this will point to member functions! */
- X.sp
- X /*
- X move to previous legal position in image
- X returns 1 when there is a previous legal position 0 otherwise
- X if the window is not initialized then it initializes it.
- X with the window in the farthest position (if possible)
- X */
- X int (* prev) (...); /* this will point to member functions! */
- X.sp
- X /*
- X Access for next and previous elements of images
- X */
- X int operator++ ( )
- X { return (* next) ( this /* because points to member*/ ); }
- X int operator-- ( )
- X { return (* prev) ( this /* because points to member*/ ); }
- X.sp
- X /*
- X Change the size of a window
- X causes the window to become uninitialized
- X */
- X void resize_window ( card width , card length );
- X.sp
- X /*
- X Causes the window to cover the entire image.
- X Allows one to access any part of the image with window operations
- X */
- X void window_entire_image ( );
- X.sp
- X };
- X.sp
- X.fi
- XCompile with -lvarc++ -lvar -liff
- X.SH "DESCRIPTION"
- XThis is a description of a C++ class to access images.
- XIt handles the concept of a 2d array of longs or doubles
- Xwith a window of a specified size.
- XThe routines are designed
- Xto check in so far as possible for illegal values given to them
- Xsuch as points outside the window to the window routines.
- XThe current implementation is designed to work with the var
- Ximage package (
- X.B "var(3)"
- X).
- X.IP "CONSTRUCTORS"
- XThere are two constructors for double or long images. The first
- Xreads in the image and constructs the correct image data structure
- Xfor it. It should be called as:
- X.nf
- X{double,long}_image input(READ,file_pointer)
- Xor
- X{double,long}_image input(READ,file_pointer,window_width,window_length)
- X.fi
- XThe last two arguments are optional and control the size of the
- Xwindow. If they are omitted then the window is 1 by 1.
- X.br
- XThe other constructor is used to create an image for output which is
- Xnot read in from a file. It should be called as:
- X.nf
- X{double,long}_image output
- X (
- X CREATE,
- X number_rows,
- X number_collumns,
- X file_pointer
- X )
- Xor
- X{double,long}_image output
- X (
- X CREATE,
- X number_rows,
- X number_collumns,
- X file_pointer,
- X window_width,
- X window_length
- X )
- X.fi
- XAs before the last two arguments are optional and when left out are
- Xinitialized to 1.
- X.PP
- XThe destructor for images is currently null.
- X.IP "Access Routines"
- XThese routines retrieve interesting private parts of the data
- Xstructure that can be useful. This allows parts of an image to be
- Xread only. This also one to pass parts of the data structure to C
- Xroutines. The first few retrieve information about the image as a
- Xwhole.
- X.br
- X.B "n_rows:"
- X retrieves the number of rows in the image.
- X.br
- X.B "n_cols:"
- X retrieves the number of collumns in the image.
- X.br
- X.B "the_prot:"
- X retrieves the protection status of the image. This way one can tell
- Xwhether the image is read or write protected.
- X.br
- X.B "c_length:"
- X returns the number of chars in the comments
- X.br
- X.B "the_comments:"
- X returns a
- X.I "not necessarily"
- Xnull terminated string containing the comments.
- X.br
- X.B "the_file:"
- X returns the file pointer which is the file for the image.
- X.br
- X.B "image_init:"
- X returns whether the image has been initialized.
- X.br
- X.br
- XThe next few access functions control the window to the image.
- X.br
- X.B "window_init:"
- X returns whether the image window has been initialized.
- X.br
- X.B "the_collumn:"
- X the collumn of the upper left hand corner of the window.
- X.br
- X.B "the_row:"
- X the row of the upper left hand corner of the window.
- X.br
- X.B "the_width:"
- X the width of the window.
- X.br
- X.B "the_length:"
- X the length of the window.
- X.br
- X.br
- XAnother access function mostly for C routines is
- X.B get_row
- Xthat retrieves a pointer to a specified row in an image.
- X.br
- X.br
- XA command that is not part of the access routines but functions in
- Xmuch the same way is
- X.B "comment_string"
- Xthat takes an image and returns a null terminated string for the
- Xcomment.
- X.IP "Comment Management"
- XThere are two routines that are used to construct comments for an
- Ximage.
- X.B "set_comments"
- Xsets the comments to a specified string of a specified length.
- X.B "add_comments"
- Xadds to the already existing comments a specified string of a
- Xspecified length.
- X.IP "Output"
- X.B "write"
- Xwrites the image out to its specified file.
- X.IP "Moving the Window"
- X.B "move_collumn"
- Xand
- X.B "move_row"
- Xincrementally move the window to a specified number of rows or
- Xcollumns. They both return a boolean to indicate whether the
- Xmove is possible.
- X.B "move_to_row"
- Xand
- X.B "move_to_collumn"
- Xare used to move the window on the image to a specified position in
- Xthe image. They will print an error message and dump core if an
- Xillegal position is specified.
- X.IP "Iterating through an Image"
- XFor iterating through an entire image there are two function
- X.I "pointers"
- X.B "*next" and
- X.B "*prev."
- XWhen
- X.B "*next"
- Xis called on an initialized image it initializes the window and
- Xsends it to the upper left hand corner of the image. Successive calls
- Xmove the window along the row until it doesn't fit any more and then
- Xto the beginning of the next collumn.
- X.B "*prev"
- Xstarts on the bottom right of the the image and moves backwards.
- X.B "++"
- Xis overloaded to be
- X.B "*next"
- Xon images and
- X.B "--"
- Xis overloaded to be
- X.B "*prev"
- Xon images.
- XBoth functions return true when they are legal and false when
- Xthey fall off the image. If they fall off the image they do nothing.
- XOne can iterate through an image using these this way:
- X.nf
- Xwhile(++image)
- Xor
- Xwhile(++input,++output)
- X.fi
- XWhen the second technique is used one must be careful to make sure
- Xthat the size of output is (input.n_rows() - input.the_length() + 1 ,
- Xinput.n_cols() - input.the_width() + 1).
- X.IP "Accessing Window Elements"
- XThere are several functions for reading or writing to elements of a
- Xwindow. For reading
- X.B "get_w_e"
- Xreturns a window element. A version of this exists without any
- Xchecking that the numbers given make sense. It is called
- X.B "fast_get_w_e."
- XUse of this code is not recomended.
- XSimilarly
- X.B "write_w_e"
- Xand
- X.B "fast_write_w_e"
- Xwrite a value to a particular point in a window. Once again I do not
- Xrecomend using
- X.B "fast_write_w_e."
- XIf you only want to access the (0,0) element of a window (especially
- Xuseful if your window is default size). You can use the overloaded
- Xfunction call operator
- X.B "()"
- Xto access or write to this element.
- Xas an example:
- X.nf
- Xoutput() = 7;
- Xwrites 7 to the upper left hand corner of the window on the image
- Xoutput.
- Xcout << input();
- Xwrites the upper left hand corner of the window to the stdout.
- X.fi
- X.IP "Changing the Size of the Window"
- XTwo member functions are supplied to retrieve the size of an existing
- Xwindow:
- X.B "resize_window"
- Xand
- X.B "window_entire_image."
- X.B "resize_window"
- Xchanges the size of a window to a specified size.
- X.b "window_entire_image"
- Xmakes the window size the same as the image size and makes the entire
- Ximage inside the window. This allows one to access any part of the
- Ximage array as a point in the window.
- X.SH "FILES"
- X/usr/local/include/image.h++
- X/usr/local/include/double_image.h++
- X/usr/local/include/long_image.h++
- X.SH "SEE ALSO"
- Xvar(3)
- X.SH "DIAGNOSTICS"
- XUsually crashes out with an error message and a core dump
- Xif something suspicious is tried.
- X.SH "BUGS"
- XEither my code has absolutely and completely no bugs or I am
- Xa bare faced liar.
- X.SH HISTORY
- X.TP
- X19-Aug-86 David Sher (sher) at University of Rochester
- XCreated.
- @//E*O*F man/image.5//
- chmod u=rw,g=r,o=r $OUT
-
- echo x - man/iff2var.1
- if test -f man/iff2var.1 ; then
- echo man/iff2var.1 exists, putting output in $$man/iff2var.1
- OUT=$$man/iff2var.1
- STATUS=1
- else
- OUT=man/iff2var.1
- fi
- sed 's/^X//' > $OUT <<'@//E*O*F man/iff2var.1//'
- X.TH IFF2VAR 1 8/21/86
- X.CM 1
- X.SH "NAME"
- Xiff2var \- Program to convert iff files to var format.
- X.SH "SYNOPSIS"
- Xiff2var [input.iff [output.var]]
- X.SH "DESCRIPTION"
- XThis is the routine to convert iff files to var files.
- XIt also
- Xdemonstrates how the var(3) routines can be called from C.
- XIf given no arguments it acts as a pipe.
- XIf you give it
- Xone argument it takes it as the input file and sends the output
- Xto stdout.
- XWith two arguments it uses the first for input and
- Xthe second for output.
- X.SH "SEE ALSO"
- Xvar(3) var(5) iff2var(3)
- X.SH "DIAGNOSTICS"
- XSome errors cause core dumps others not.
- X.SH "BUGS"
- XNo doubt.
- X.SH HISTORY
- X.TP
- X21-Aug-86 David Sher (sher) at University of Rochester
- XCreated.
- @//E*O*F man/iff2var.1//
- chmod u=rw,g=r,o=r $OUT
-
- echo x - man/var2iff.1
- if test -f man/var2iff.1 ; then
- echo man/var2iff.1 exists, putting output in $$man/var2iff.1
- OUT=$$man/var2iff.1
- STATUS=1
- else
- OUT=man/var2iff.1
- fi
- sed 's/^X//' > $OUT <<'@//E*O*F man/var2iff.1//'
- X.TH VAR2IFF 1 8/21/86
- X.CM 1
- X.SH "NAME"
- Xvar2iff \- a conversion program from var format to iff
- X.SH "SYNOPSIS"
- Xvar2iff [input.var [output.iff]]
- X.SH "DESCRIPTION"
- XThis takes files in the var(5) image format and generates files
- Xin the iff(5) image format.
- XIf no arguments this is a pipe,
- Xwith one argument uses it to find input with two arguments
- Xuses them for input and output.
- X.SH "SEE ALSO"
- Xvar(3) var(5) iff(5) var2iff(3) iff2var(1)
- X.SH "DIAGNOSTICS"
- XDumps core at times when given spurious input.
- XShould always print error messages though!
- X.SH "BUGS"
- XNone so far.
- X.SH HISTORY
- X.TP
- X21-Aug-86 David Sher (sher) at University of Rochester
- XCreated.
- @//E*O*F man/var2iff.1//
- chmod u=rw,g=r,o=r $OUT
-
- echo x - man/ascii2var.1
- if test -f man/ascii2var.1 ; then
- echo man/ascii2var.1 exists, putting output in $$man/ascii2var.1
- OUT=$$man/ascii2var.1
- STATUS=1
- else
- OUT=man/ascii2var.1
- fi
- sed 's/^X//' > $OUT <<'@//E*O*F man/ascii2var.1//'
- X.TH ASCII2VAR 1 8/25/86
- X.CM 1
- X.SH "NAME"
- Xascii2var \- A program to translate an ascii file to a floating point image
- X.SH "SYNOPSIS"
- Xascii2var [input.ascii [output.var]]
- X.SH "DESCRIPTION"
- XThis is the program that takes a file in ascii format and returns a
- Xvar(5) file.
- XThe ascii format is a pair of dimensions (length followed
- Xby width) and then the pixels followed by comments.
- XIf no arguments
- Xit is a pipe.
- XOtherwise it can take an input file and send to stdout
- Xor it can take both an input and an output file.
- XThis program can facilitate passing floating point images
- Xbetween machines with incompatible floating point formats.
- X.SH "SEE ALSO"
- Xvar(5) var(3) vartools(3)
- Xvar2ascii(1)
- X.SH "DIAGNOSTICS"
- XIf something major goes wrong it prints an error message and dumps
- Xcore.
- X.SH "BUGS"
- XHmmm...
- @//E*O*F man/ascii2var.1//
- chmod u=rw,g=r,o=r $OUT
-
- echo Inspecting for damage in transit...
- temp=/tmp/sharin$$; dtemp=/tmp/sharout$$
- trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
- cat > $temp <<\!!!
- 24 222 1311 README
- 6 42 249 copywrite
- 61 207 1344 main.c++
- 31 102 671 makefile
- 58 60 3415 uu.test.var
- 93 317 2359 main.c++
- 31 102 672 makefile
- 60 208 1630 main.c++
- 31 102 673 makefile
- 534 2655 15637 image.5
- 26 121 688 iff2var.1
- 23 106 647 var2iff.1
- 25 133 793 ascii2var.1
- 1003 4377 30089 total
- !!!
- wc README copywrite ascii2var/main.c++ ascii2var/makefile ascii2var/uu.test.var correlate/main.c++ correlate/makefile lowerbound/main.c++ lowerbound/makefile man/image.5 man/iff2var.1 man/var2iff.1 man/ascii2var.1 | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
- if test -s $dtemp ; then
- echo "Ouch [diff of wc output]:"
- cat $dtemp
- STATUS=1
- elif test $STATUS = 0 ; then
- echo "No problems found."
- else
- echo "WARNING -- PROBLEMS WERE FOUND..."
- fi
- exit $STATUS
-